const { getTimeUntil } = require('../utils/date');
const isDevelopment = process.env.NODE_ENV === 'development';
const isDebug = process.env.LOG_DEBUG === 'true';

// 从环境变量获取定时任务执行时间，如果没有则使用默认值
const COMPRESS_HOUR = parseInt(process.env.COMPRESS_HOUR) || 2;
const COMPRESS_MINUTE = parseInt(process.env.COMPRESS_MINUTE) || 0;
const CLEAN_HOUR = parseInt(process.env.CLEAN_HOUR) || 3;
const CLEAN_MINUTE = parseInt(process.env.CLEAN_MINUTE) || 0;

/**
 * 为指定任务设置定时执行（每日）
 * @param {Function} task - 要执行的任务函数（异步或同步）
 * @param {number} hour - 执行时间的小时（0-23）
 * @param {number} minute - 执行时间的分钟（0-59）
 */
function scheduleTask(task, hour, minute) {
  const delay = getTimeUntil(hour, minute);

  setTimeout(async () => {
    try {
      await task();
    } catch (err) {
      
      if (isDevelopment || isDebug) {
        console.error('定时任务执行失败:', err);
      }
    } finally {
      // 无论任务执行成功或失败，都继续设置下一天的定时任务
      scheduleTask(task, hour, minute);
    }
  }, delay);
}

/**
 * 立即检查是否需要执行压缩任务（避免今天的时间过去后要等到明天）
 * @param {Function} compressTask 压缩任务函数
 * @param {Function} cleanTask 清理任务函数
 */
async function runInitialTasks(compressTask, cleanTask) {
  // 环境变量信息只在调试模式下打印
  if (isDebug) {
    console.log('=== 日志系统环境变量信息 ===');
    console.log('检查是否需要立即执行日志维护任务');
    console.log('运行环境(NODE_ENV): ' + process.env.NODE_ENV);
    console.log('日志级别(LOG_LEVEL): ' + process.env.LOG_LEVEL);
    console.log('调试模式(LOG_DEBUG): ' + process.env.LOG_DEBUG);
    console.log('日志保留时间(LOG_RETENTION): ' + process.env.LOG_RETENTION);
    console.log('压缩任务执行时间(COMPRESS_HOUR:MINUTE): ' + COMPRESS_HOUR + ':' + (COMPRESS_MINUTE < 10 ? '0' + COMPRESS_MINUTE : COMPRESS_MINUTE));
    console.log('清理任务执行时间(CLEAN_HOUR:MINUTE): ' + CLEAN_HOUR + ':' + (CLEAN_MINUTE < 10 ? '0' + CLEAN_MINUTE : CLEAN_MINUTE));
    console.log('========================');
  }

  const now = new Date();

  // 只有在凌晨2点之后才执行立即压缩任务
  if (now.getHours() >= 2) {
    // 如果当前时间已经超过凌晨2点，立即执行压缩任务
    if (isDebug) {
      console.log('[启动] 立即执行日志压缩任务');
    }
    try {
      await compressTask();
    } catch (err) {
      
      if (isDevelopment || isDebug) {
        console.error('立即执行日志压缩任务失败:', err);
      }
    }
  }

  // 只有在凌晨3点之后才执行立即清理任务
  if (now.getHours() >= 3) {
    // 如果当前时间已经超过凌晨3点，立即执行清理任务
    if (isDebug) {
      console.log('[启动] 立即执行日志清理任务');
    }
    try {
      await cleanTask();
    } catch (err) {
      
      if (isDevelopment || isDebug) {
        console.error('立即执行日志清理任务失败:', err);
      }
    }
  }

  // 设置定时任务
  if (isDebug) {
    console.log('[启动] 设置定时日志维护任务');
  }
  // 压缩任务安排在每天指定时间执行
  scheduleTask(compressTask, COMPRESS_HOUR, COMPRESS_MINUTE);

  // 清理任务安排在每天指定时间执行
  scheduleTask(cleanTask, CLEAN_HOUR, CLEAN_MINUTE);
}

module.exports = {
  scheduleTask,
  runInitialTasks
};